//std::fmt::Display
// #[derive(Debug)]
// enum PokerSuit{
//     Clubs,
//     Speads,
//     Diamonds,
//     Hearts,
// }

// struct PokerCard
// {
//     suit: PokerCard,
//     valur: u8
// }

// fn main()
// {
//     let heart = PokerSuit::Hearts;
//     let diamond = PokerSuit::Diamonds;

//     print_suit(heart);
//     print_suit(diamond);
// }

// fn print_suit(card:PokerSuit)
// {
//     println!("{:?}",card);
// }


//可以直接将数据信息关联到枚举成员上
enum PokerSuit{
    Clubs(u8),
    Speads(u8),
    Diamonds(u8),
    Hearts(u8),
}
fn main()
{
    let c1 = PokerSuit::Speads(6);
    let c2 = PokerSuit::Diamonds(8);
}

//不同的成员还能持有不同的数据类型
enum PokerCard {
    Clubs(u8),
    Spades(u8),
    Diamonds(char),
    Hearts(char),
}
fn main() {
   let c1 = PokerCard::Spades(5);
   let c2 = PokerCard::Diamonds('A');
}



//任何类型的数据都可以放入枚举成员中: 例如字符串、数值、结构体甚至另一个枚举。
enum Message {
    Quit,               //Quit 没有任何关联数据
    Move { x: i32, y: i32 },//Move 包含一个匿名结构体
    Write(String),          //Write 包含一个String字符串
    ChangeColor(i32, i32, i32),//ChangeColor包含三个i32
}
fn main() {
    let m1 = Message::Quit;
    let m2 = Message::Move{x:1,y:1};
    let m3 = Message::ChangeColor(255,255,0);
}




//Option枚举用于处理空值

//Option枚举包含两个成员，一个成员表示含有值:Some(T), 另一个表示没有值: None
enum Option<T>{
    some(T),
    None
}
// Some(T)表示该枚举成员的数据类型是T, 换句话说，Some可以包含任何类型的数据。
// Option<T> 枚举是如此有用以至于它甚至被包含在了prelude(prelude属于Rust标准库，
// Rust会将最常用的类型、函数等提前引入其中，避免我们再手动引入)之中，你不需要将其显式引入作用域。
// 另外，它的成员Some 和 None也是如此，无需使用Option::前缀就可直接使用Some 和 None。
// 总之，不能因为Some(T)和None中没有Option::的身影，就否认它们是Option下的卧龙凤雏。